Projet Kit Big Data MDI 721

Pierre Dal Bianco

Importation des librairies

Récupération des fichiers Excel avec les classements

Tout d'abord téléchargeons l'ensemble des fichiers sur notre machine, dans un dossier data. Nous pouvons remarquer que le fichier change une fois que le premier équipage arrive. Nous allons récupérer l'heure et la date d'arrivée du premier équipage pour ne filtrer que les fichiers antérieurs à la date d'arrivée du premier équipage

Attention : une fois les fichiers téléchargés il n'est plus nécessaire de ré-executer cette cellule. La dernière ligne open... a été commentée pour éviter de télécharger les fichiers en cas d'execution par inattention.

On constate que le premier et le dernier fichier ont des formats différents, nous allons les exclure par la suite. Nous allons créer une fonction pour charger un fichier en dataframe, le nettoyer (supprimer les NA) et convertir toutes ses colonnes en format ad hoc. Nous allons de plus utiliser la date et l'heure d'arrivée de chaque étape comme index datetime.

Nous allons maintenant boucler sur tous les fichiers pour tous les charger, les convertir et les fusionner en un seul dataframe.

Première exploration des données

Nous allons extraire quelques informations de notre jeu de données pour en apprendre plus sur la course et ses participants (ceux qui ont fini la course).

De combien de lignes de données disposons nous ?

Quels sont les équipages, le nom et numéro de leur bateau, leur nationalité ainsi que la distance moyenne parcourue par tranche de 24h ?

Quel est le classement moyen de chaque équipage ?

Combien de temps a durée la course ? Nous n'avons les données que jusqu'à ce que le premier équipage arrive, on peut s'attendre à une durée légerement inférieure à celle annoncée sur le site internet (80j).

Essayons maintenant de faire quelques tracés pour mieux comprendre notre jeu de données. Nous allons tirer 4 skippers aléatoires et tracer les vitesses, VMG et distance sur les dernières 24h.

Quel est l'équipage qui finit premier lors du dernier jour avant la fin de la course

Pouvons-nous voir un lien entre le classement et la VMG sur 24h pour l'équipage que nous venons d'isoler ?

Le lien n'est pas immédiatement évident 'à l'oeil nu'.

Corrélation et régression linéaire

Faisons une regression linéaire entre le classement et la vitesse utile (VMG).

D'abord nous allons retirer les valeurs négatives de la VMG sur 24h, qui peuvent être vues comme des outliers. Nous allons ensuite splitter les données pour créer un jeu de train (constitué de 75% des données initiales) et un jeu de test (25% des données initiales). Puis nous allons faire une régression linéraire des moindres carrés.

Pour évaluer notre régression on peut calculer et afficher l'erreur quadratique (doit être le plus faible possible) et le coefficient de détermination (doit être le plus proche de 1 possible).

On peut également tracer la densité des résidus = vraies valeurs - valeurs prédites

Pour aller plus loin, on pourrait essayer d'identifier d'autres facteurs qui pourraient influencer le classement pour faire une régression linéaire sur plusieurs vaiables explicatives. La fonction pairplot de Seaborn est un bon point de départ pour cela.

Grâce à ce pairplot on se rend compte que qu'il semble avoir une relation linéaire entre les variables distance, VMG et Speed. Faisons une régression linéaire du rang en fonction de ces vaibles ainsi que la variable DTF et comparons les scores obtenus avec ceux de notre régression précedente.

On obtient des scores un peu meilleurs avec cette régression.

Extraction des données sur les voiliers

Nous allons extraire toutes les données sur les bateaux sous forme d'un DataFrame que nous allons ensuite nettoyer pour obtenir des données sous forme exploitable

Rapprochement des données des voiliers avec celle des classements

Nous pouvons insérer les données voilers que nous venons d'extraire dans le premier DataFrame

Impact de la présence d'un foil

Calculons les vitesses, VMG et distances moyennes sur 24h et le nombre d'équipages par type de dérive

Il semble qu'en moyenne sur 24h les voiliers équipés de foils ont une plus grand vitesse, VMG et parcourent une plus grande distance. La présence d'un foil semble donc apporter un bénefice.

Seaborn permet de tracer des barplot des distances sur 24h et de les grouper par le nombre de dérives.

On complément nous pouvons tracer moyennes sur 24h des vitesses, VMG et distances par type de dérive. Nous allons faire un resample par moyenne par jour pour afficher des résultats lisibles.

D'après ces graphes il apparaît assez clairement que les voiliers équipés de foils ont des meilleurs résultats (en terme de vitesse, VMG et distance moyennes sur 24h) que ceux équipés de 2 dérives. Le voilier équipé de 2 dérives asymétriques a une variabilité plus importante, et ont en moyenne des résultats moins bons que les voiliers équipés de foils, d'après les résultats vu précedemment, mais cela peut aussi être dû au fait qu'un seul équipage utilise ce type de dérives. Il y a donc moins de données pour moyenner.

Nous pouvons aussi essayer de voir si la présence d'un foil a une influence sur le classement. Avec Seaborn on peut faire une heatmap du classement en fonction des valeurs dans la colonne Nombre de dérives

Il semblerait que les équipages qui ont un foil arrivent plus souvent en tête de classement, mais il sont aussi plus nombreux, ce qui peut expliquer ce qu'on observe.

Visualisation de la distance parcourue par voilier

Dans un premier temps on peut tracer les distances (sur 30min, 24h et depuis le dernier rapport) pour 4 voiliers tirés au hasard. Nous allons lisser les résultats sur 1 semaine pour une meilleur lisibilité.

Traçons maintenant les distances parcourues par équipage. Nous allons mettre en évidence les équipages qui utilisent des foils.

Cartes avec les routes d'un ou plusieurs voiliers

Affichons des cartes avec les routes de plusieurs équipages avec ipyleaflet

Affichons tous les itinéraires avec plotly sur un globe 3D.

Analyses de séries temporelles

Analysons l'évolution de la VMG (sur 24h) moyenne au cours de la course. Dans un premier temps nous allons génerer un dataframe qui agrège l'évolution de la VMG au cours du temps. Nous allons faire une resampling sur 4 hours et remplir les NA avec un forward fill.

Ajoutons une moyenne glissante sur 5 jours et traçons les résultats

Ajoutons un lissage exponentiel sur 5 jours et traçons le résultat

A l'aide de la fonction seasonal_decompose de statsmodels, on peut décomposer la série temporelle en une somme de trois composantes : tendance + seasonalité + résidu que l'on peut afficher. Nous allons travailler sur une période de 24h.

Nous allons entrainer un modèle prédictif SARIMAX. Pour cela dans un premier temps nous découpons notre jeu de données en un jeu train et un jeu test.

Entrainons le modèle et affichons les résultats. les paramètres order et seasonal_order sont des paramètres du modèles sur lesquels on peut jouer pour essayer d'améliorer le score.

Maintenant que notre modèle est entrainé nous pouvons faire des prédictions sur le jeu de données test et afficher les vraies données vs les prédictions sur un même graphe.

On constate que notre modèle arrive à prédire la valeur moyenne mais prédit mal les variations à plus hautes fréquence.

Application d'algorithmes statistiques

Essayons de faire une classification du types de voilier avec une méthode KMeans. Dans un premier temps nous allons préparer un dataframe pour cette classification.

Pour cela nous allons utiliser des données numériques, une colonne catégorielle (pour le type de voile quille) et un one hot encoder pour le type de dérive. Certaines des données numériques présentent des NA. Nous allons les remplacer par la meilleur des valeur sur la colonne.

Nous allons ensuite normaliser les colonnes numériques

Méthode du coude : Nous pouvons maintenant tracer la distortion d'un algorithme KMeans pour plusieurs valeurs de k (= nombre de catégories cherchées). L'idée est que le k optmial se trouve au niveau du coude dans la courbe (point d'inflexion de la courbe)

Il n'y a malheureusement pas de point d'inflexion évident, prenons une valeur de k = 5. Et affichons quel voilier de quel équipage se trouve dans chaque catégorie

Affichons le nombre de voiliers dans chaque catégorie sous forme d'un piechart

On se rend compte qu'il y a 1 voire 2 catégories que ne regroupent qu'un ou deux voiliers (les résultats données par KMeans ne sont pas stables et peuvent varier d'une itération à une autre), on aurait pu réduire le nombre de catégories à 3 ou 4.